package com.doubao.chat.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doubao.chat.entity.ChatMessage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 聊天消息Mapper接口
 */
@Mapper
public interface ChatMessageMapper extends BaseMapper<ChatMessage> {

    /**
     * 分页获取会话消息列表
     *
     * @param page      分页参数
     * @param sessionId 会话ID
     * @param maxId     最大消息ID，用于分页
     * @return 消息列表
     */
    IPage<ChatMessage> selectSessionMessages(Page<ChatMessage> page,
                                             @Param("sessionId") Long sessionId,
                                             @Param("maxId") Long maxId);

    /**
     * 获取会话最近的上下文消息
     *
     * @param sessionId 会话ID
     * @param limit     消息数量限制
     * @return 消息列表
     */
    List<ChatMessage> selectContextMessages(@Param("sessionId") Long sessionId,
                                            @Param("limit") Integer limit);

    /**
     * 获取会话的所有消息
     *
     * @param sessionId 会话ID
     * @return 消息列表
     */
    List<ChatMessage> selectSessionAllMessages(@Param("sessionId") Long sessionId);

    /**
     * 删除会话所有消息
     *
     * @param sessionId 会话ID
     * @return 删除行数
     */
    int deleteSessionMessages(@Param("sessionId") Long sessionId);

    /**
     * 根据会话ID列表批量删除消息
     *
     * @param sessionIds 会话ID列表
     * @return 删除行数
     */
    int batchDeleteMessagesBySessionIds(@Param("sessionIds") List<Long> sessionIds);

    /**
     * 获取消息总token数
     *
     * @param sessionId 会话ID
     * @return token总数
     */
    Long selectTotalTokensBySessionId(@Param("sessionId") Long sessionId);

    /**
     * 检查用户是否已对智能体评分
     *
     * @param userId   用户ID
     * @param deviceId 智能体ID
     * @return 评分数量
     */
    Integer checkIsRated(@Param("userId") Long userId,
                         @Param("deviceId") Long deviceId);

    /**
     * 根据用户ID和设备ID查询消息
     */
    // SQL查询保持按ID降序排列，获取最新的size条消息
    @Select("SELECT * FROM chat_message WHERE user_id = #{userId} AND device_id = #{deviceId} ORDER BY id DESC LIMIT #{size} OFFSET #{offset}")
    List<ChatMessage> findByUserAndDevice(@Param("userId") Long userId, @Param("deviceId") Long deviceId,
                                          @Param("offset") Integer offset, @Param("size") Integer size);
}